package com.hb.trade.server.flow.manager;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.pinyin.PinyinUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.hb.core.pojo.flow.mapper.FlowTempFormFieldMapper;
import com.hb.core.pojo.flow.mapper.FlowTempMainMapper;
import com.hb.core.pojo.flow.dto.FlowTempFormFieldDTO;
import com.hb.core.pojo.flow.dto.FlowTempMainDTO;
import com.hb.core.pojo.flow.dto.FlowTempNodeDTO;
import com.hb.core.pojo.flow.entity.FlowTempFormField;

import java.util.List;

public class FlowTempMainManager extends FlowTempMainDTO {

    /**
     * 获取自定义表单字段集合并设置字段编码和排序号
     *
     * @param tempMainId
     * @return
     */
    public List<FlowTempFormFieldDTO> getFormFieldWithTempMainId(Long tempMainId) {
        List<FlowTempFormFieldDTO> formFields = this.getFormFields();
        if (CollUtil.isNotEmpty(formFields)) {
            CollUtil.forEach(formFields, (item, index) -> {
                item.setTempMainId(tempMainId);
                String fieldName = item.getFieldName();
                item.setFieldCode(PinyinUtil.getPinyin(fieldName, ""));
                item.setSortNum(index);
                item.buildBaseData(1);
            });
        }
        return formFields;
    }

    /**
     * 发起流程参数验证(该方法无法在API层中调用)
     *
     * @return
     */
    public String launchValid() {
        // 流程模板ID
        Long flowTempId = this.getId();
        if (flowTempId == null) {
            return "必须指定流程模板";
        }
        List<FlowTempFormFieldDTO> formFields = this.getFormFields();
        if (CollUtil.isEmpty(formFields)) {
            return "请填写表单内容";
        }
        FlowTempMainMapper tempMainMapper = SpringUtil.getBean(FlowTempMainMapper.class);
        int count = tempMainMapper.countById(flowTempId);
        if (count == 0) {
            return "未能查询到该流程模板信息";
        }
        Long launchUserId = this.getUserId();
        if (launchUserId == null) {
            return "未能获取到发起人标识";
        }
        FlowTempFormFieldMapper tempFormFieldMapper = SpringUtil.getBean(FlowTempFormFieldMapper.class);
        for (FlowTempFormFieldDTO formFieldDto : formFields) {
            // 查询数据库中表单配置进行验证
            FlowTempFormField orgTempField = tempFormFieldMapper.selectById(formFieldDto.getId());
            // 将表单字段模板的其他属性复制过来
            BeanUtil.copyProperties(orgTempField, formFieldDto, CopyOptions.create().ignoreNullValue());
            // 判断是否必填
            Integer notNullFlag = orgTempField.getNotNullFlag();
            if (!Integer.valueOf(1).equals(notNullFlag)) {
                continue;
            }
            String fieldValue = formFieldDto.getFieldValue();
            if (StrUtil.isEmpty(fieldValue)) {
                return formFieldDto.getFieldName() + " 为必填字段";
            }
        }
        return null;
    }
    /**
     * 获取节点集合
     *
     * @return
     */
    public List<FlowTempNodeDTO> getNodeList(Long tempMainId) {
        List<FlowTempNodeDTO> nodes = getNodeList(this.getTempNode());
        CollUtil.forEach(nodes, (node, index) -> node.setTempMainId(tempMainId));
        return nodes;
    }

    /**
     * 获取节点集合
     * 私有方法
     *
     * @param tempNode
     * @return
     */
    private List<FlowTempNodeDTO> getNodeList(FlowTempNodeDTO tempNode) {
        List<FlowTempNodeDTO> nodeDtos = this.getNodeDtos();
        if (nodeDtos == null) {
            nodeDtos = CollUtil.list(false);
        }
        if (tempNode != null) {
            nodeDtos.add(tempNode);
            getNodeList(tempNode.getNextNode());
        }
        return nodeDtos;
    }

    /**
     * 验证每个审批节点的参数
     *
     * @param tempNode
     * @return
     */
    private String checkNode(FlowTempNodeDTO tempNode) {
        if (tempNode != null) {
            String nodeName = tempNode.getNodeName();
            if (StrUtil.isEmpty(nodeName)) {
                return "审批节点名称不能为空";
            }
            Integer signFlag = tempNode.getSignFlag();
            if (signFlag == null) {
                return "[" + tempNode.getNodeName() + "] 没有设置审批方式([会签]或者[或签])";
            }
            Integer refuseType = tempNode.getRefuseType();
            if (refuseType == null) {
                return "[" + tempNode.getNodeName() + "] 没有设置审批驳回时的回退方式";
            }
            Integer allowAddsign = tempNode.getAllowAddsign();
            if (allowAddsign == null) {
                return "[" + tempNode.getNodeName() + "] 没有设置是否允许加签";
            }
            return checkNode(tempNode.getNextNode());
        }
        return null;
    }
}
